
// Database Packages
import java.sql.*;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.DriverManager;

// Communication Port Packages
import javax.comm.SerialPort;
import javax.comm.CommPortIdentifier;
import javax.comm.SerialPortEventListener;
import javax.comm.SerialPortEvent;
import javax.comm.PortInUseException;
import javax.comm.UnsupportedCommOperationException;

// Event Listerner Packages
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

// Input Output (I/O) Stream Packages
//import java.io.InputStream;
//import java.io.OutputStream;
import java.io.*;

// Utilities Packages
import java.text.NumberFormat;
import java.util.Enumeration;
import java.util.StringTokenizer;
import java.util.TooManyListenersException;

// Utilities untuk Waktu
import java.util.Date;

// Untilities untuk Pattern
import java.util.regex.Pattern;

public class ramalSMS
    implements SerialPortEventListener{

  /**
   * Methode ]
   * Keterangan : Proses pertama kali program dijalankan
   * proses : Mengatur ukuran, posisi letak, dan tampilan program
   * @param args :
   */
  // Awal methode main

  public static void main(String[] args) throws IOException{
    String tombol;
  	String str;
	int pilih = -1;
	int pilihLagi;
 	try{
 
  	System.out.print("|==============================================================================|");
  	System.out.print("|                     <|--  RAMALAN KI GENDENG SABLENG --|>                    |");
  	System.out.print("|                           ^ JAMINAN RAMALAN SALAH ^                          |");
  	System.out.print("|==============================================================================|");
  	System.out.print("|                                   SMS SERVER                                 |");
  	System.out.print("|                                                                              |");
  	System.out.print("|     >>Tekan 1 untuk mulai menjalankan server                                 |");
  	System.out.print("|     >>Tekan 0 untuk keluar dari program                                      |");
  	System.out.print("|                                                                              |");
  	System.out.print("|  Server Belum Akif                                                           |");
  	System.out.print("|==============================================================================|");
  	System.out.print("|                            	    copyright@2009                             |");
  	System.out.print("|                          http://seno008.blogspot.com                         |");
  	System.out.print("|==============================================================================|");
	System.out.print("|  ->Silahkan masukkan pilihan Anda[1/0] kemudian tekan Enter:");  	

	for(int i=0; i<5;i++){
		BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
  		pilih = (new Integer(input.readLine())).intValue();
  		
  		if(pilih == 1){
  			ramalSMS frame = new ramalSMS();  
		}
		else if(pilih == 0){
			System.out.println("Terima kasih. Sampai jumpa.........!");
			System.exit(0);
		}
		else{
			System.out.println("Pilihan Anda tidak valid!");
			System.out.println("  ->Silahkan masukkan pilihan Anda[1/0] kemudian tekan tombol Enter:");  	
			}
		if(i==3){
			System.out.println("  ->Perhatian! Ini kesempatan terakhir, masukkan pilihan dengan benar!");
		}
	}
	
		System.out.println("  ->Maaf, kesempatan Anda hanya 5 kali!");
	}catch(IOException e){
		System.out.println("Silahkah ulangi sesuai dengan petunjuk di layar");
		System.out.println("Kesalahan terjadi pada "+e);
		} 
} // Akhir Main
   

  
int i = 0;
// Awal Methode ramal
public ramalSMS() {
    prosesMulai();
} // Akhir Methode ramal
  

  /**
   * Methode Jam
   * Keterangan : Proses mencetak Jam (Waktu)
   * Contoh : Selamat Malan --- Sabtu, 08 Januari 2005 --- Jam 20:00:46
   */
  // Deklarasi Komponen-komponen Methode Tampilan Jam
  
  String salam = null; // Keadaan Waktu
  String nolTanggal = null;
  String nolJam = null;
  String nolMenit = null;
  String nolDetik = null;
  String tanggalSekarang = null;
  Date dt = null; // instansiasi obyek Date
  
  int tanggal; // nilai Tanggal Sekarang
  int hari; // Nilai Hari Sekarang
  int bulan; // Nilai Bulan Sekarang
  int bulanSekarang;
  int tahun; // Nilai Tahun Sekarang
  int jam; // Nilai Jam Sekarang
  int menit; // Nilai Menit Sekarang
  int detik; // Nilai Detik Sekarang
  String[] namaHari = null; // Nama Hari
  String[] namaBulan = null; // Nama Bulan


  // Awal methode Jam
  public void Jam() {
    // Mendapatkan Nilai Waktu Sekarang
    dt = new Date();
    tanggal = dt.getDate();
    hari = dt.getDay();
    bulan = dt.getMonth();
    bulanSekarang = bulan + 1;
    tahun = dt.getYear() + 1900;
    jam = dt.getHours();
    menit = dt.getMinutes();
    detik = dt.getSeconds();

    // Memberikan nilai String untuk nilai hari
    namaHari = new String[8];
    namaHari[0] = "Minggu";
    namaHari[1] = "Senin";
    namaHari[2] = "Selasa";
    namaHari[3] = "Rabu";
    namaHari[4] = "Kamis";
    namaHari[5] = "Jumat";
    namaHari[6] = "Sabtu";

    // Memberikan nilai String untuk nilai bulan
    namaBulan = new String[12];
    namaBulan[0] = "Januari";
    namaBulan[1] = "Februari";
    namaBulan[2] = "Maret";
    namaBulan[3] = "April";
    namaBulan[4] = "Mei";
    namaBulan[5] = "Juni";
    namaBulan[6] = "Juli";
    namaBulan[7] = "Agustus";
    namaBulan[8] = "September";
    namaBulan[9] = "Oktober";
    namaBulan[10] = "November";
    namaBulan[11] = "Desember";

	tanggalSekarang = tahun+"-"+bulanSekarang+"-"+tanggal+" "+jam+":"+menit+":00";
    // Keadaan Waktu Sekarang
    if (jam <= 4) {
      salam = "Selamat Dini Hari";
    }
    if ( (jam >= 5) && (jam <= 10)) {
      salam = "Selamat Pagi";
    }
    if ( (jam >= 11) && (jam <= 15)) {
      salam = "Selamat Siang";
    }
    if ( (jam >= 16) && (jam <= 18)) {
      salam = "Selamat Sore";
    }
    if (jam >= 18) {
      salam = "Selamat Malam";
    }

    // Penanganan Digit Waktu
    if (tanggal <= 9) {
      nolTanggal = "0";
    }
    else {
      nolTanggal = "";
    }
    if (jam <= 9) {
      nolJam = "0";
    }
    else {
      nolJam = "";
    }
    if (menit <= 9) {
      nolMenit = "0";
    }
    else {
      nolMenit = "";
    }
    if (detik <= 9) {
      nolDetik = "0";
    }
    else {
      nolDetik = "";
    }
    
   //System.out.println(salam + ", " + namaHari[hari] + ", " + nolTanggal +
                // tanggal + " " + namaBulan[bulan] + " " + tahun + " ** Jam : " +
                 //nolJam + jam + ":" + nolMenit + menit + ":" + nolDetik + detik);
  } // Akhir methode Jam
  

 /**
   * Methode setDatabase
   * Keterangan : Penyambungan Database
   */
  // Deklarasi Variabel
  int statusServer = 0; // Status penyambungan server
  Connection koneksi = null; // instansiasi obyek Connection

  // Awal methode setDatabase
  public void setDatabase() {
    // Cetak pesan ke layar
    System.out.println("Starting server....");
    System.out.println("Server is reading the configuration ....");
    // parameter koneksi database
    try {
      // Penyambungan Driver
      Class.forName("com.mysql.jdbc.Driver"); 
      // Penyambungan Database
      koneksi = DriverManager.getConnection("jdbc:mysql://localhost/ramalan","root","");

      // Cetak pesan ke layar
    	System.out.println("Connecting to Database");
    	System.out.println("Server connecting Terminal!!!");
    	System.out.println("Wait a minutes ..............");
      // Status server Database telah tersambung
      statusServer = 1;
	} // Akhir try
    // Apabila Kelas Driver Tidak Ditemukan
    catch (ClassNotFoundException not) {
      System.out.println("Server didn't found JDBC-ODBC driver" );///aku tambah ++i
      System.out.println("Failed to connect Database ...." );
      System.out.println("Error in : " + not );
      System.out.println("" );
    }
    // Apabila Gagal melakukan penyambungan Database
    catch (SQLException sqln) {
      System.out.println("Cann't find Url.." );
      System.out.println("Failed to connect Database .... ...." );
      System.out.println("Connecting failed ...." );
      System.out.println("Error in : " + sqln );
      System.out.println("" );
    }
  } // Akhir Methode setDatabase

/**
 *Methode : cariPort
 *Keterangan : untuk mencari port
 *
 */
 
 
    public void cariPort(){
 	System.out.println("Daftar Port");
	System.out.println(" ~~~~~~~~~~~~~~~~~~~~~~~~~");
	System.out.println("| 1. COM1	6. COM6  |");
	System.out.println("| 2. COM2	7. COM7  |");
	System.out.println("| 3. COM3	8. COM8  |");
	System.out.println("| 4. COM4	9. COM9  |");
	System.out.println("| 5. COM5      10. COM10 |");
	System.out.println(" ~~~~~~~~~~~~~~~~~~~~~~~~~");
	System.out.print("Silahkan masukkan port yang Anda pilih[1...10]=");
	try{
		BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
  	pilih = (new Integer(input.readLine())).intValue();
  	if(pilih ==  1){
  		portName = "COM1";
  	}
  	else if(pilih == 2){
  		portName = "COM2";
  	}
  	else if(pilih == 3){
  		portName = "COM3";
  	}
  	else if(pilih == 4){
  		portName = "COM4";
  	}
  	else if(pilih == 5){
  		portName = "COM5";
  	}
  	else if(pilih == 6){
  		portName = "COM6";
  	}
  	else if(pilih == 7){
  		portName = "COM7";
  	}
  	else if(pilih == 8){
  		portName = "COM8";
  	}
  	else if(pilih == 9){
  		portName = "COM9";
  	}
  	else if(pilih == 10){
  		portName = "10";
  	}
  	else {
  		System.out.print("Pilihan yang valid adalah 1 s/d 10");
  		cariPort();
  	}
  }catch(IOException e){
  }
 }
  /**
   * Methode setTerminal
   * Keterangan : penyambungan dan pengaturan terminal
   */
  // Deklarasi variabel Serial Port
  SerialPort port = null;
  Enumeration portList = null;
  CommPortIdentifier portId = null;
  InputStream input;
  OutputStream output;
  String portName = null; // Nama Port
  int nilaiBaud = 0; // Nilai Baud Rate
  int nilaiData = SerialPort.DATABITS_8; // Nilai DATABITS
  int nilaiStop = SerialPort.STOPBITS_1; // Nilai STOPBITS
  int nilaiParity = SerialPort.PARITY_NONE; // Nilai PARITY
  int nilaiFlow = SerialPort.FLOWCONTROL_NONE; // Nilai FLOWCONTROL
  int pilih;

  // Awal methode setTerminal
  public void setTerminal() {
	
	
  cariPort();
  
    // Cetak pesan ke layar
    System.out.println("You choosed port "+portName);
    System.out.println("Server is trying to find the port");
    // Mencari daftar port-port yang tersedia
    Enumeration portList = CommPortIdentifier.getPortIdentifiers();
    while (portList.hasMoreElements()) {
      // Mengambil nilai-nilai port yang ditemukan
      CommPortIdentifier portId = (CommPortIdentifier) portList.nextElement();
      // Hanya Port Serial yang diambil
      if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
        // Buka port berdasarkan nama port yang telah ditentukan (COM1)
        if (portId.getName().equals(portName)) {
          try {
            port = (SerialPort) portId.open("SMS", 5000);
            // Cetak pesan ke layar
            System.out.println("Succes opening port : " + portName);  
          } //Akhir try open port
          catch (PortInUseException piue) {
            System.out.println("Port : " + portName + " is used");
            System.out.println("Failed to connect terminal .........");
            System.out.println("Error in : " + piue);
          } //Akhir catch
        } //Akhir if port getName

      } // Akhir if port getPortType

    } // Akhir while

    // Membuka input dan output Stream pada Port
    try {
      output = port.getOutputStream();
      input = port.getInputStream();
    } // Akhir try stream
    catch (IOException ioe) {
      System.out.println("Failed opening stream");
      System.out.println("Error in : " + ioe);
    } //Akhir catch
    // Mengatur Konfigurasi dari Serial Port
    System.out.println("Daftar Nilai Baut");
	System.out.println("1. 2400		6. 57600");
	System.out.println("2. 4800		7. 115200");
	System.out.println("3. 9600		8. 230400");
	System.out.println("4. 19200	9. 460800");
	System.out.println("5. 38400	10.921600");
	System.out.print("Silahkan masukkan nilai baud yang Anda pilih[1...10]=");
	try{
		BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
  	pilih = (new Integer(input.readLine())).intValue();
  	if(pilih ==  1){
  		nilaiBaud = 2400;
  	}
  	else if(pilih == 2){
  		nilaiBaud = 4800;
  	}
  	else if(pilih == 3){
  		nilaiBaud = 9600;
  	}
  	else if(pilih == 4){
  		nilaiBaud = 19200;
  	}
  	else if(pilih == 5){
  		nilaiBaud = 38400;
  	}
  	else if(pilih == 6){
  		nilaiBaud = 57600;
  	}
  	else if(pilih == 7){
  		nilaiBaud = 115200;
  	}
  	else if(pilih == 8){
  		nilaiBaud = 230400;
  	}
  	else if(pilih == 9){
  		nilaiBaud = 460800;
  	}
  	else if(pilih == 10){
  		nilaiBaud = 921200;
  	}
  	else {
  		System.out.println("Pilihan yang valid adalah 1 s/d 10");
  	}
  }catch(IOException e){
  }
    try {
      port.setSerialPortParams(nilaiBaud, nilaiData, nilaiStop, nilaiParity);
      port.setFlowControlMode(nilaiFlow);
      // Menerima pemberitahuan jika ada data pada terminal
      port.notifyOnDataAvailable(true);

      // Cetak pesan ke layar
      System.out.println("Server trying to connect : " + portName);
      System.out.println("Success connecting port : " + portName);
      System.out.println("Setting terminal");
      System.out.println("Wait a minutes please .....");

      // Melakukan pengatur TERMINAL
      kirimAT("AT" + "\15", 1250); // Apakah terminal telah siap
      kirimAT("AT+CMGF=0" + "\15", 1250); // Menetapkan Format PDU Mode
      kirimAT("AT+CSCS=GSM" + "\15", 1250); // Menetapkan Encoding
      kirimAT("AT+CNMI=1,1,2,2,1" + "\15", 1250); // Mendengarkan Pesan secara Otomatis
      kirimAT("AT+CMGL=0" + "\15", 1250); // Membaca Pesan yang belum dibaca yang ada di dalam Inbox

		// Status server Terminal telah tersambung
      statusServer = 2;
    } //Akhir try serial port params
    catch (UnsupportedCommOperationException ucoe) {
      System.out.println("Failed setting Data Serial Port");
      System.out.println("Error in : " + ucoe);
    
    }
    // Menambahkan Event Listener pada Serial Port
    try {
      port.addEventListener(this);
    } //Akhir try addEvenListener
    catch (TooManyListenersException tmle) {
      System.out.println("Error in : " + tmle);

    }

  } // Akhir Methode setTerminal

  /**
   * Methode balikKarakter
   * Keteranga : membalik atau menukar posisi sebuah nilai (2 karakter)
   * @param  : karakter = nilai yang akan dibalik
   * @return : stringBuffer
   */
  // Deklarasi variabel
  static int panjangKarakter = 0;
  static StringBuffer stringBuffer = null;

  // Awal methode balikKarakter
  public static String balikKarakter(String karakter) {
    panjangKarakter = karakter.length();
    stringBuffer = new StringBuffer(panjangKarakter);
    for (int i = 0; (i + 1) < panjangKarakter; i = i + 2) {
      stringBuffer.append(karakter.charAt(i + 1));
      stringBuffer.append(karakter.charAt(i));
    }
    return new String(stringBuffer);
  } // Akhir methode balikKarakter

  /**
   * Methode rubahKeHexa
   * Keterangan : Konversi nilai Desimal menjadi Hexadesimal
   * @param a : nilai desimal yang akan dikonversi
   * @return : karakter
   */
  // Deklarasi variabel
  static char[] hexa;
  static char[] karakter;

  // Awal methode rubahKeHexa
  public static String rubahKeHexa(int a) {
    char[] hexa = {
        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D',
        'E', 'F'};

    karakter = new char[2];
    // Mengambil hanya 8 bit 255d = 11111111 b
    a = a & 255;
    // hasil pembagian dengan 16
    karakter[0] = hexa[a / 16];
    // sisa hasil pembagian dengan 16
    karakter[1] = hexa[a % 16];

    return new String(karakter);
  } // Akhir Methode rubahKeHexa

  /**
   * Methode delapanKeTujuhBit
   * Keterangan : Merubah 8 bit menjadi 7 bit (GSM ke ASCII)
   * @param pesan  : pesan SMS yang akan dirubah
   * @param msglen : panjang pesan SMS
   * @return : msg
   */
  // Deklarasi variabel
  static char[] gsmToAsciiMap; // GSM ==> ASCII

  // Awal methode delapanKeTujuhBit
  public static String delapanKeTujuhBit(String pesan, int msglen) {
  	//System.out.println("Pesan Delapan ke tujuh "+pesan);
  	//System.out.println(msglen);
    int i, o, r = 0, rlen = 0, olen = 0, charcnt = 0;
    StringBuffer msg = new StringBuffer(160);
    int pesanlen = pesan.length();
    String ostr;
    char c;

    for (i = 0; ( (i + 1) < pesanlen) && (charcnt < msglen); i = i + 2) {
      // mengambil dua digit Hexadesimal
      ostr = pesan.substring(i, i + 2);
      o = Integer.parseInt(ostr, 16);
      // berikan nilai olen = 8
      olen = 8;

      // geser posisi semua bit ke kiri sebanyak rlen bit
      o <<= rlen;
      o |= r; // berikan sisa bit dari o ke r
      olen += rlen; // olen = olen + rlen

      c = (char) (o & 127); // mendapatkan nilai o menjadi 7 bit
      o >>>= 7; // geser posis bit ke kanan sebanyak 7 bit
      olen -= 7;

      r = o; // menaruh sisa bit dari o ke r.
      rlen = olen;

      c = gsmToAsciiMap[c]; // rubah ke Text (kode ASCII)
      msg.append(c); // tambahkan ke msg
      charcnt++; // nilai charcnt ditambahkan 1

      // jika rlen >= 7
      if (rlen >= 7) {
        c = (char) (r & 127);
        r >>>= 7;
        rlen -= 7;
        msg.append(c);
        charcnt++;
      }
    } // Akhir for
    if ( (rlen > 0) && (charcnt < msglen)) {
      msg.append( (char) r);
    }
    return msg.toString();
  } // Akhir methode delapanKeTujuhBit

  /**
   * Methode tujuhKeDelapanBit
   * Keteranga : Merubah dari 7 bit menjadi 8 bit (ASCII ke GSM)
   * @param pesan : Pesan SMS yang akan dirubah
   * @return : encmsg
   */
  // Deklarasi variabel
  static char[] asciiToGsmMap; // ASCII ==> GSM

  // Awal methode tujuhKeDelapanBit
  public static String tujuhKeDelapanBit(String pesan) {

    StringBuffer msg = new StringBuffer(pesan);

    StringBuffer encmsg = new StringBuffer(2 * 160);
    int bb = 0, bblen = 0, i;
    char o = 0, c = 0, tc;

    for (i = 0; i < msg.length() || bblen >= 8; i++) {
      if (i < msg.length()) {
        c = msg.charAt(i);
        tc = asciiToGsmMap[c];

        c = tc;

        c &= ~ (1 << 7);
        bb |= (c << bblen);
        bblen += 7;
      }

      while (bblen >= 8) {
        o = (char) (bb & 255);
        encmsg.append(rubahKeHexa(o));
        bb >>>= 8;
        bblen -= 8;
      }
    }
    if ( (bblen > 0)) {
      encmsg.append(rubahKeHexa(bb));
    }
    return encmsg.toString();
  } // Akhir methode tujuhKeDelapanBit

  static {
    final int lastindex = 255;
    gsmToAsciiMap = new char[lastindex + 1];
    asciiToGsmMap = new char[lastindex + 1];
    int i;

    for (i = 0; i <= lastindex; i++) {
      gsmToAsciiMap[i] = asciiToGsmMap[i] = (char) i;
    }
  } // Akhir static

  /**
   * Methode PduTerimaSms
   * Keterangan : Merubah pesan SMS format PDU menjadi format teks
   * @param smspdu : nilai pesan SMS PDU yang akan dirubah
   */
  // Deklarasi variabel
  String infoSmsc = null;
  int nilaiSmsc = 0;
  int nomorSmsc = 0;
  String panjangNotlp = null;
  int nilaiPanjangNotlp = 0;
  int nilaiNotlp = 0;
  String Notlp = null;
  String dapatNotlp = null;
  String panjangPesan = null;
  int nilaiPanjangPesan = 0;
  String pesanPDU = null;
  String pesan = null;

  // Awal methode PduTerimaSms
  public void PduTerimaSms(String smspdu) {
    int i = 0;
    try {
      // Mengambil nilai panjang informasi SMSC
      infoSmsc = smspdu.substring(i, 2);
      nilaiSmsc = Integer.parseInt(infoSmsc, 16);
      // format nomor dan nomor MSC dibuang
      i = i + 4;
      nomorSmsc = i + (nilaiSmsc * 2) - 2;
      // Nilai PDU Type dibuang
      i = nomorSmsc + 2;
      // Mengambil Panjang Nomor Telepon Pengirim
      panjangNotlp = smspdu.substring(i, i + 2);
      nilaiPanjangNotlp = Integer.parseInt(panjangNotlp, 16);
      // format nomor pengirim dibuang
      i = i + 4;
      nilaiNotlp = i + nilaiPanjangNotlp + nilaiPanjangNotlp % 2;
      // Nomor telepon pengirim
      Notlp = smspdu.substring(i, nilaiNotlp);
      dapatNotlp = balikKarakter(Notlp);
      i = nilaiNotlp;
      // Nilai PID, DCS, dan SCTS dibuang
      i = i + 18;
      // Mengambil Panjang Pesan SMS
      panjangPesan = smspdu.substring(i, i + 2);
      nilaiPanjangPesan = Integer.parseInt(panjangPesan, 16);
      i = i + 2;
      pesanPDU = smspdu.substring(i, smspdu.length());
      pesan = delapanKeTujuhBit(pesanPDU, nilaiPanjangPesan);
    }
    catch (Exception e) {}
  } // Akhir Metode PduTerimaSms

  /**
   * Methode PduKirimSms
   * Keterangan : Merubah pesan SMS format teks menjadi format PDU
   * @param notlp  : Nomor telepon tujuan
   * @param pesan  : isi Pesan yang akan dikirim
   * @return : pesanPDUKirim
   */
  // Deklarasi Variabel
  static StringBuffer pesanPDUKirim = null;
  static int panjangNotlpTujuan = 0;
  static int panjangPesanKirim = 0;
  static String PduPesan = null;

  // Awal methode PduKirimSms
  public static String PduKirimSms(String notlp, String pesan) {
  	
    pesanPDUKirim = new StringBuffer(320); // 320 = 160 * 2 (panjang max)
    // Tambahkan nilai PDU Type ---> Default = 11
    pesanPDUKirim.append("11");
    // Tambahkan nilai MR ---> Default = 00
    pesanPDUKirim.append("00");
    // Tambahkan nilai panjang nomor pengirim
    panjangNotlpTujuan = notlp.length();
    pesanPDUKirim.append(rubahKeHexa(panjangNotlpTujuan));
    // Tambah nilai format no. telepon --> format internasional = 91
    pesanPDUKirim.append("91");
    // Tambahkan nilai nomor telepon pengirim
    // Jika panjang notlp adalah ganjil
    if ( (notlp.length() % 2) == 1) {
      notlp = balikKarakter(notlp + "F");
    }
    // Jika panjang notlp adalah genap
    else {
      notlp = balikKarakter(notlp);
    }
    pesanPDUKirim.append(notlp);
    // tambahkan nilai PID ---> Default = 00
    pesanPDUKirim.append("00");
    // tambahkan nilai DCS ---> Default = 00
    pesanPDUKirim.append("00");
    // tambahkan nilai VP = 4 hari ---> AA h
    pesanPDUKirim.append("AA");
    panjangPesanKirim = pesan.length();
    PduPesan = tujuhKeDelapanBit(pesan);
    pesanPDUKirim.append(rubahKeHexa(panjangPesanKirim));
    pesanPDUKirim.append(PduPesan);

    return new String(pesanPDUKirim);

  } // Akhir Methode PduKirimSms

  /**
   * Methode kirimAT
   * Keterangan : Mengirim AT Command ke Terminal
   * @param atCmd  : Nilai AT Command
   * @param delay  : Waktu delay pengiriman AT Command
   */
  // Awal methode kirimAT
  public void kirimAT(String atCmd, int delay) {
    Boolean tungguDelay = new Boolean(true);
    boolean getDelay = false;
    // Membuat antrian proses
    synchronized (tungguDelay) {
      try {
        // Menulis AT Commmand
        output.write( (atCmd).getBytes());
        // Hapus OutputStream
        output.flush();
      } //Akhir Try
      catch (IOException e) {}
      try {
        tungguDelay.wait(delay);
      } // Akhir try
      catch (InterruptedException ie) {
        getDelay = true;
      } // Akhir catch
    } // Akhir syncronized
  } // Akhir Methode kirim AT

  // Serial Event
  // Serial Port Listener
  /**
   * Methode serialEvent
   * Keterangan : menerima respon dari terminal
   * @param event = reapon yang diterima terminal
   */
  // Deklarasi variabel
  int bufferOffset = 0;
  byte[] bacaBuffer = new byte[100000];
  int n;

  // Awal methode serialEvent
  public void serialEvent(SerialPortEvent event) {
    try {
      // Apabila ada respons dari terminal, lakukan pembacaan
      while ( (n = input.available()) > 0) {
        n = input.read(bacaBuffer, bufferOffset, n);
        bufferOffset += n;

        // Jika ada respons "\15" (Line Feed Carriage Return),
        if ( (bacaBuffer[bufferOffset - 1] == 10) &&
            (bacaBuffer[bufferOffset - 2] == 13)) {
          String buffer = new String(bacaBuffer, 0, bufferOffset - 2);
          // Berikan ke methode terimaAT
          terimaAT(buffer);
          bufferOffset = 0;
        } // Akhir if
      } // Akhir while
    } // Akhir try
    catch (IOException e) {
      ;
    }
  } // Akhir methode serialEvent

  /**
   * Methode terimaAT
   * Keterangan : Memproses respon yang diterima dari terminal
   * @param buffer : respon dari terminal yang telah dibuang karakter CRLF
   */
  // Deklarasi variabel
  String[] hasil;
  int Index;
  int panjangPDU;
  int PDU = 0;
  String respons;
  StringTokenizer st;

  // Awal methode terimaAT
  public void terimaAT(String buffer) {
  	
    // Menguraikan buffer berdasarkan karakter CRLF
    st = new StringTokenizer(buffer, "\r\n");

    while (st.hasMoreTokens()) {
      // mengambil token yang ada pada obyek
      respons = st.nextToken();
      // Cetak respon ke layar
      System.out.println(respons);
 
      // Memproses respon yang diterima
      try {
        // Jika Ada Telepon yang Masuk
        if (respons.startsWith("RING")) {
          kirimAT("ATH0" + "\15", 100); // Diputuskan
        } // Akhir if "RING"

        // Jika ada Pesan Baru yang Masuk
        else if (respons.startsWith("+CMTI:")) {
          Pattern pattern = Pattern.compile(",");
          hasil = pattern.split(respons.trim());
          Index = Integer.parseInt(hasil[1].trim());
          kirimAT("AT+CMGR=" + Index + "\15", 1250); // Baca Pesan Baru yang Masuk
        } // Akhir if "+CMTI:"

        // Jika ada Pesan Baru Yang dibaca
        else if (respons.startsWith("+CMGR:")) {
          PDU = 1;
        } // Akhir if "+CMGR:"

        // Membaca Pesan Indox yang belum dibaca
        else if (respons.startsWith("+CMGL")) {
          Pattern pattern = Pattern.compile(":");
          hasil = pattern.split(respons.trim());
          pattern = Pattern.compile(",");
          hasil = pattern.split(hasil[1].trim());
          Index = Integer.parseInt(hasil[0].trim());
          PDU = 1;

        }else if (respons.startsWith("+CMGL=0")){
        	Pattern pattern = Pattern.compile(":");
          hasil = pattern.split(respons.trim());
          pattern = Pattern.compile(",");
          hasil = pattern.split(hasil[1].trim());
          Index = Integer.parseInt(hasil[0].trim());
          PDU = 1;
        }
        else if (PDU == 1) {
          prosesTerimaSms(Index, respons.trim());
          PDU = 0;
        }
        else {}
      }
      catch (Exception e) {} // Akhir while
    }
  } // Akhir Methode terimaAT

  /**
   * Methode prosesTerimaSms
   * Keterangan : Proses menerima pesan SMS yang masuk
   * @param Index : Nomor penyimpanan SMS pada SIM CARD
   * @param Pdu   : Pesan SMS dalam format PDU
   */
  // Awal methode prosesTerimaSms
  public void prosesTerimaSms(int Index, String Pdu) {
  	//System.out.println("ProsesTerimaSMS");
    try {
      // Rubah dari format PDU menjadi Format Teks
      PduTerimaSms(Pdu);
    } // Akhir try
    catch (Exception e) {}
    // Jika nomor telepon pengirim diakhiri dengan "F"
    if (dapatNotlp.endsWith("F")) {
      // Buang karakter "F"
      dapatNotlp = dapatNotlp.substring(0, dapatNotlp.length() - 1);
    }
    // Hapus Pesan yang Telah dibaca
    kirimAT("AT+CMGD=" + Index + "\15", 1250);
    // Tulis ke tabel TERIMA
    tulisDataTabelTerima(dapatNotlp, pesan);
    // Cetak ke Layar
    System.out.println("Pesan Dari Nomor : " + dapatNotlp);
    System.out.println("Isi Pesan : " + pesan);
  } // Akhir Methode prosesTerimaSms

  /**
   * Methode tulisDataTabelTerima
   * Keterangan : Menulis data pesan SMS yang diterima ke tabel TERIMA
   * @param notlp : Nomor telepon pengirim
   * @param pesan : Isi pesan SMS (dalam format Teks)
   */
  // Deklarasi Variabel
  	PreparedStatement pStatement = null;
  	String sql = null;
	String strpsnMsk = "";
	String Temp = "";
	String TmpPesan= "";
	String[] hsl,hsl2;
	int p;
	
	
  // Awal methode tulisDataTabelTerima
  public void tulisDataTabelTerima(String nohp, String pesan) {
  	try {
		strpsnMsk = pesan.trim();
	    // Melakukan Parsing (parameter parsing adalah SPASI)
    	Pattern pattern2 = Pattern.compile(" ");
    	hsl2 = pattern2.split(strpsnMsk.trim());
    	p=0;
        while(p <= hsl2.length) {
        	
        	         	  	
        	   if(hsl2[p].trim().toString().equals("")) {

        	   }else {
        	   	 Temp = hsl2[p].trim().toString();
        	   	 TmpPesan= TmpPesan +" "+ Temp;
        	   	
        	   }
        	
        	p++;
        	
        
        	
        }
    }catch(Exception e) {}

    try {
    	
    	System.out.println(tanggalSekarang+", "+TmpPesan+", "+nohp +" Belum Diproses");
      // SQL (Masukkan ke tabel TERIMA)
            Class.forName("com.mysql.jdbc.Driver"); 
      		// Penyambungan Database
      		koneksi = DriverManager.getConnection("jdbc:mysql://localhost/ramalan","root","");

      pStatement = koneksi.prepareStatement(
          //"Insert Into tterimasms(DTGL, CPESAN, CNOHP, CSTATUS) Values (?,?,?,?)");
          "Insert Into tterimasms(CPESAN, CNOHP, CSTATUS) Values ('"+TmpPesan+"','"+nohp+"','Belum Diproses')");
      try {
      	//pStatement.setString(1, tanggalSekarang);
      //	pStatement.setString(2, TmpPesan);
      //  pStatement.setString(3, nohp);
      //  pStatement.setString(4, "Belum Diproses");
       
        pStatement.executeUpdate();

      } // Akhir try
      catch (Exception ei) {}
      // Menutup Statement
      pStatement.close();
    } // Akhir try
    catch (Exception e) {}
        strpsnMsk ="";
    	Temp="";
    	TmpPesan="";

  } // Akhir Methode tulisDataTabelTerima

  /**
   * Methode ambilTerima
   * Keterangan : Mengambil data pesan SMS pada tebel TERIMA yang ber-STATUS Belum Diproses
   */
  // Deklarasi Variabel
  String dataId = null; // ID Pesan
  String dataNotlp = null; // Nomer Telepon Pengirim
  String dataPesan = null; // Isi Pesan
  

  // Awal methode ambilTerima
  public void ambilTerima() {
    try {
    		
      // Statement SQL
      Class.forName("com.mysql.jdbc.Driver"); 
      // Penyambungan Database
      koneksi = DriverManager.getConnection("jdbc:mysql://localhost/ramalan","root","");

      sql = 
      "Select CID, CNOHP, CPESAN From tterimasms Where CSTATUS='Belum Diproses'";
     
      pStatement = koneksi.prepareStatement(sql);
      
      try {
		 
        ResultSet rSet = pStatement.executeQuery();
      
        while (rSet.next()){
      
          // Mengambil data dari tabel TERIMA
          dataId = rSet.getString("CID"); // ID Pesan
          dataNotlp = rSet.getString("CNOHP"); // Nomer Telepon Pengirim
          dataPesan = rSet.getString("CPESAN");       // Isi Pesan
      
          // Berikan nilai ke methode prosesTabelTerima
          if (dataNotlp.length() > 6) {
    		tulisStatusData(dataId, "Sudah Diproses");
    		prosesTabelTerima(dataId, dataNotlp, dataPesan);
          }else{
          	tulisStatusData(dataId, "Sudah Diproses");	
          	System.out.println("No telepon terlalu pendek");
		  }
        } // Akhir while
        // Menutup Statement SQL
        pStatement.close();
      } // Akhir try ResultSet
      catch (Exception ie) {}
    } // Akhir try SQL
    catch (Exception e) {}
  } // Akhir Methode ambilTerima



  /**
   * Methode prosesTabelTerima
   * Keterangan : Memproses data pesan SMS yang diambil dari tebel TERIMA
   * @param id    : Nomor penyimpanan data pesan SMS pada tabel TERIMA
   * @param notlp : Nomor telepon pengirim
   * @param pesan : Isi pesan SMS
   */
  // Deklarasi variabel
  String kode1 = null;
  String kode2 = null;
  String kode3 = null;
  String kode4 = null;
  String kode5 = null;
  String kode_1_salah = null;
  String kode_2_salah = null;
  String kode_3_salah = null;
  String kode_1_format = null;
  String pesanSalah = null;

  // Awal methode prosesTabelTerima
  public void prosesTabelTerima(String id, String notlp, String pesan) {
   
   	//tulisStatusData(id, "Sudah Diproses");
	kode1 = "";
	kode2 = "";
	kode3 = "";
	kode4 = "";
	kode5 = "";
    // Melakukan Parsing (parameter parsing adalah SPASI)
    Pattern pattern = Pattern.compile(" ");
    hasil = pattern.split(pesan.trim());
 
 		if(hasil.length==1) {
        	 kode1 = hasil[0].trim().toString().toUpperCase(); // Kode pertama
        	 tulisDataTabelKirim(notlp, "Format yang benar:\n"+
    			" CINTA TGLLAHIR, contoh CINTA 030480,"+
    			" UNTUNG TGLLAHIR, contoh CINTA 030480,"+
    			" KARIR TGLLAHIR, contoh CINTA 030480.");
    
        }else if(hasil.length==2) {
        	
        	kode1 = hasil[0].trim().toString().toUpperCase(); 
    		kode2 = hasil[1].trim().toString(); 
    		        
        }else if(hasil.length==3) {
        	
        	kode1 = hasil[0].trim().toString().toUpperCase(); 
    		kode2 = hasil[1].trim().toString(); 
    		kode3= hasil[2].trim().toString(); 
    		
        }else if(hasil.length==4) {
        	
        	kode1 = hasil[0].trim().toString().toUpperCase(); 
    		kode2 = hasil[1].trim().toString(); 
    		kode3= hasil[2].trim().toString(); 
    		kode4= hasil[3].trim().toString(); 
    	 	
        }
        else if(hasil.length>=5) {
        	
        	kode1 = hasil[0].trim().toString().toUpperCase(); // Kode pertama
    		kode2 = hasil[1].trim().toString(); // Kode kedua
    		kode3= hasil[2].trim().toString(); 
    		kode4= hasil[3].trim().toString(); 
    		kode5= hasil[4].trim().toString(); 
        	                
        }
   
    String kdramal="";
    if (kode1.trim().equals("CINTA")) {
    	kdramal = "R01";
    	ramal(notlp, kdramal, kode2);
    } else if(kode1.trim().equals("UNTUNG")){
    	kdramal = "R02";
    	ramal(notlp, kdramal, kode2);
    } else if(kode1.trim().equals("KARIR")){
    	kdramal = "R03";
    	ramal(notlp, kdramal, kode2);
    }    
    
  } // Akhir Methode prosesTabelTerima

  
  /**
   * Methode ramal
   * Keretangan : ramal client
   * @param notlp : Nomor telepon pengirim
   * @param kode2 : Kode 2 dari format pesan SMS (kode ramal)
   * @param kode2 : Kode 2 dari format pesan SMS (tgl lahir)
   */
  // Deklarasi Variabel
 
String sqlramal = null;
int jmlTgl=0;
int kodehasil=0;

  // Awal methode ramal
  public void ramal(String notlp, String kdramal, String tgl) {
  	if(tgl.toString() == ""){
  		//tulisDataTabelKirim(notlp, "Anda belum menulis tanggal lahir Anda, ketik CINTA TGLLHR, UNTUNG TGLLHR, KARIR TGLLHR");
  	}
  	else{
  		int pnjngTgl = tgl.length();
  		if (pnjngTgl != 6) {
  			tulisDataTabelKirim(notlp, "Anda salah menulis tanggal lahir, format yang benar tglblnthn, contoh 030580.");
  		}
  		else{
  		
		for (int i = 0; i < 6; i++) {

				if(tgl.substring(i, i+1).equals("0")){
  					jmlTgl += 0;		
  				}
  				else if(tgl.substring(i, i+1).equals("1")){
  					jmlTgl += 1;		
  				}
  				else if(tgl.substring(i, i+1).equals("2")){
  					jmlTgl += 2;		
  				}
  				else if(tgl.substring(i, i+1).equals("3")){
  					jmlTgl += 3;		
  				}
  				else if(tgl.substring(i, i+1).equals("4")){
  					jmlTgl += 4;		
  				}
  				else if(tgl.substring(i, i+1).equals("5")){
  					jmlTgl += 5;		
  				}
  				else if(tgl.substring(i, i+1).equals("6")){
  					jmlTgl += 6;		
  				}
  				else if(tgl.substring(i, i+1).equals("7")){
  					jmlTgl += 7;		
  				}
  				else if(tgl.substring(i, i+1).equals("8")){
  					jmlTgl += 8;		
  				}
  				else if(tgl.substring(i, i+1).equals("9")){
  					jmlTgl += 9;		
  				}
  				
  			}
  			
  			if(jmlTgl > 9 && jmlTgl <= 18){
  				jmlTgl = jmlTgl - 9;
  			}else if(jmlTgl > 18 && jmlTgl <= 27){
  				jmlTgl = jmlTgl - 18;
  			}else if(jmlTgl > 27 && jmlTgl <= 36){
  				jmlTgl = jmlTgl - 27;
  			}else if(jmlTgl > 36 && jmlTgl <= 45){
  				jmlTgl = jmlTgl - 36;
  			}else if(jmlTgl > 45 && jmlTgl <= 54){
  				jmlTgl = jmlTgl - 45;
  			}
  			
   			if (jmlTgl == 1){
   				kodehasil = 1;
   			}else if (jmlTgl == 2){
   				kodehasil = 2;
   			}else if (jmlTgl == 3){
   				kodehasil = 3;
   			}else if (jmlTgl == 4){
   				kodehasil = 4;
   			}else if (jmlTgl == 5){
   				kodehasil = 5;
   			}else if (jmlTgl == 6){
   				kodehasil = 6;
   			}else if (jmlTgl == 7){
   				kodehasil = 7;
   			}else if (jmlTgl == 8){
   				kodehasil = 8;
   			}else if (jmlTgl == 9){
   				kodehasil = 9;
   			}else{
   				tulisDataTabelKirim(notlp, "Tanggal lahirnya salah, format yang bener = DDMMYY, contoh CINTA 120286");
   			}		
   			
   			sqlramal = "select chasil from thslramalan where ckdramal = '"+kdramal+"' and ckdhsl = "+kodehasil;
   			try{
   	   	    Class.forName("com.mysql.jdbc.Driver"); 
      // Penyambungan Database
      		koneksi = DriverManager.getConnection("jdbc:mysql://localhost/ramalan","root","");

   			pStatement = koneksi.prepareStatement(sqlramal);
   			try{
   				
   				ResultSet rSet = pStatement.executeQuery();
   				
   				while(rSet.next()){
   					
   					tulisDataTabelKirim(notlp, rSet.getString("CHASIL"));
   			
   				}
   			
   		
   			}catch (SQLException sqln){}
   		pStatement.close();
   		}catch(Exception sqln){
   			System.out.println("Data tidak ditemukan!");
   		}
   	}
 }
 
}

// Proses menulis Hasil Query ke tabel KIRIM
  /**
   * Methode tulisDataTabelKirim
   * Keterangan : Menulis Data yang akan dikirim pada tabel TERIMA
   * @param notlp : Nomor telepon tujuan
   * @param dataKirim : Pesan yang akan dikirim
   */

  // Awal methode tulisDataTabelKirim
  public void tulisDataTabelKirim(String notlp, String dataKirim) {
  	
    try {
          Class.forName("com.mysql.jdbc.Driver"); 
      // Penyambungan Database
      koneksi = DriverManager.getConnection("jdbc:mysql://localhost/ramalan","root","");
    String sql;
    sql="Insert Into tkirimsms(CNOHP, CPESAN, CSTATUS) Values ('"+notlp+"','"+dataKirim+"','Belum Dikirim')";
    pStatement=koneksi.prepareStatement(sql);
       
        try {
      	
         //pStatement.setString(1,notlp);
         //pStatement.setString(2,dataKirim);
         //pStatement.setString(3,"Belum Dikirim");
         //pStatement.setString(4,tanggalSekarang);
        
        pStatement.executeUpdate();
      }
      catch (Exception e) {}
      pStatement.close();
    }
    catch (Exception e) {}
  } // Akhir Methode tulisDataTabelKirim

  /**
   * Methode ambilKirim
   * Keterangan : Mengambil data pesan SMS pada tebel KIRIM yang ber-STATUS Belum Dikirim
   */
  // Deklarasi Variabel
  String idKirim = null;
  String notlpKirim = null;
  String pesanKirim = null;
  // Awal methode ambilKirim
  public void ambilKirim() {
 
    try {
      // Statement SQL
      String sql =
          "Select CID, CPESAN, CNOHP From tkirimsms Where CSTATUS='Belum Dikirim'";
      //System.out.println(sql);
            Class.forName("com.mysql.jdbc.Driver"); 
      // Penyambungan Database
      koneksi = DriverManager.getConnection("jdbc:mysql://localhost/ramalan","root","");

      pStatement = koneksi.prepareStatement(sql);
     // System.out.println(pStatement);
      try {

        ResultSet rSet = pStatement.executeQuery();
        while (rSet.next()) {
          // Mengambil data dari tabel TERIMA
          idKirim = rSet.getString("CID"); // ID Pesan
          notlpKirim = rSet.getString("CNOHP"); // Nomer Telepon Pengirim
          pesanKirim = rSet.getString("CPESAN"); // Isi Pesan
          System.out.println(
              "Server Mengambil Data yang belum dikirim pada Tabel KIRIM");
          // Berikan nilai ke methode prosesTabelTerima
          prosesKirimSms(idKirim, notlpKirim, pesanKirim);

        } // Akhir while
        // Menutup Statement SQL
        pStatement.close();
      } // Akhir try ResultSet
      catch (Exception ie) { }
    } // Akhir try SQL
    catch (Exception e) { }
    
  } // Akhir Methode ambilKirim

  /**
   * Methode prosesKirimSms
   * Keterangan : Mengirim Pesan SMS
   * @param id : Nomor Penyimpanan data pesan SMS pada tabel KIRIM
   * @param notlp : Nomor telepon tujuan
   * @param pesan : pesan SMS yang dikirim
   */

  // Awal methode prosesKirimSms
  public void prosesKirimSms(String id, String notlp, String pesan) {
    try {
      // Menulis status pesan Tebel KIRIM menjadi "Telah Dikirim"
      tulisStatusData(id, "Sudah Dikirim");

      // Merubah pesan menjadi Format PDU (Protocol Data Unit)
      String pesanPDUKirim = PduKirimSms(notlp.trim(), pesan.trim());
      // Proses Mengirim Pesan
     System.out.println("Kirim ke : " + notlp);
     kirimAT("AT+CMGS=" + (pesanPDUKirim.length() / 2) + "\15", 500);
     kirimAT("00" + pesanPDUKirim, 1250); // Kirim Pesan Format PDU
     kirimAT("\032", 100); // Ctrl + Z

      // Berikan waktu sleep agar terminal siap kembali untuk mengirim pesan
      Thread.currentThread().sleep(10000);

    } // Akhir try

    catch (Exception e) {}
  } // Akhir Methode prosesKirimSms

// Menulis STATUS dari data yang ada pada tabel TERIMA dan KIRIM
  /**
   * Methode tulisStatusData
   * Keterangan : melakukan update atau pemuktahiran terhadap status data
   *              pada tabel TERIMA dan KIRIM yang telah berhasil diproses
   * @param id : Nomor Penyimpanan data pesan SMS pada tabel KIRIM
   * @param status : Status Data
   */

  // Awal methode tulisStatusData
  public void tulisStatusData(String id, String status) {
    String tulisStatus = null;
    String tulisStatusJadwal = null;
	String tulisStatusDetail = null;
    try {
      // Jika status pesan "Telah Dikirim"
      if (status.equals("Sudah Dikirim")) {
        tulisStatus = "Update tkirimsms Set CSTATUS='Sudah Dikirim' Where CID="+id;
      }
      // Jika status pesan "Telah Diproses"
      if (status.equals("Sudah Diproses")) {
        tulisStatus = "Update tterimasms Set CSTATUS='Sudah Diproses' Where CID="+id;
      }
      
    
      // SQL
      pStatement = koneksi.prepareStatement(tulisStatus);
      try {
        //pStatement.setString(1, id);
        pStatement.executeUpdate();
      } // Akhir try
      catch (Exception e) {}
      // Menutup Statement
      pStatement.close();
    } // Akhir try
    catch (Exception e) {}
  } // Akhir Methode tulisStatusData
  
    public void pilihMenu(){
  

	int pilih = -1;
	System.out.print("|==============================================================================|");
  	System.out.print("|                     <|--  RAMALAN KI GENDENG SABLENG --|>                    |");
  	System.out.print("|                           ^ JAMINAN RAMALAN SALAH ^                          |");
  	System.out.print("|==============================================================================|");
  	System.out.print("|                                   SMS SERVER                                 |");
  	System.out.print("|                                                                              |");
  	System.out.print("|    >>Tekan 0 untuk keluar dari program                                       |");
  	System.out.print("|                                                                              |");
  	System.out.print("|  Server Aktif                                                                |");
  	System.out.print("|                                                                              |");
  	System.out.print("|==============================================================================|");
  	System.out.print("|                                 copyright@2009                               |");
  	System.out.print("|                          http://seno008.blogspot.com                         |");
	System.out.print("|==============================================================================|");
  	System.out.print("|  Silahkan masukkan pilihan Anda[2/0]:");  	
  try{
	
	BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
  	pilih = (new Integer(input.readLine())).intValue();
   	
	if(pilih == 0){
		System.out.println("Jika Anda yakin ingin keluar dari program, ketik, 0, lalu tekan tombol Enter");
		System.out.println("Ketik sembarang untuk kembali ke program");
		BufferedReader tanya = new BufferedReader(new InputStreamReader(System.in));
  		int jawab = (new Integer(input.readLine())).intValue();
  		
  		if(pilih == 0){
			System.out.println("Terima kasih. Sampai jumpa.........!");
		 	System.exit(0);
		}
		
	}

	else {
		System.out.println("Pilihan Anda tidak valid.");
	//	kirimSMS();
	}
	
	}catch(Exception e){} 
}

  /**
   * Methode prosesMulai
   * Keterangan : Menjalankan SMS Server
   */

  // Awal Methode prosesMulai
  public void prosesMulai() {
    setDatabase();
   
    if (statusServer == 1) {
      //cariPort();
      setTerminal();
      if (statusServer == 2) {
        prosesJam jam = new prosesJam();
        ThreadAmbilDataKirim kirim = new ThreadAmbilDataKirim();
        ThreadAmbilDataTerima terima = new ThreadAmbilDataTerima();
        ThreadMenu menu = new ThreadMenu();
   
        jam.start();
        kirim.start();
        terima.start();
        menu.start();

      }
    }

  } // Akhir Methode prosesMulai

  /**
   * Methode prosesTutup
   * Keterangan : Menutup SMS Server
   */

  // Awal Methode prosesTutup
 
  public void prosesTutup() {
  
      System.exit(0);
          } // Akhir If
  

// Class Untuk selalu memanggil methode Jam

  class prosesJam
      extends Thread {
    public prosesJam() {

    } // Akhir Methode prosesJam

    public void run() {
      while (true) {
        Jam();
        try {
          Thread.sleep(1000);
        } // Akhir try
        catch (InterruptedException e) {}
      } // Akhir while
    } //Akhir Methode run
  } // Akhir class prosesJam

// Class Untuk selalu memanggil methode ambilTerima()
  class ThreadAmbilDataTerima
      extends Thread {
    public ThreadAmbilDataTerima() {
    } // Akhir Methode ThreadAmbilDataTerima

    public void run() {
      while (true) {
        ambilTerima();
        try {
          Thread.sleep(1000);
        } // Akhir try
        catch (InterruptedException e) {}
      } // Akhir while
    } //Akhir Methode run
  } // Akhir class ThreadAmbilDataTerima

//class untuk selalu memanggil methode prosesUltah()


// Class Untuk Selalu memanggil methode ambilKirim()
  class ThreadAmbilDataKirim
      extends Thread {
    public ThreadAmbilDataKirim() {
    } // Akhir Methode ThreadAmbilDataKirim

    public void run() {
      while (true) {
        ambilKirim();
        try {
          Thread.sleep(2000);
        } // Akhir try
        catch (InterruptedException e) {}
      } // Akhir while
    } //Akhir Methode run
  } // Akhir class ThreadAmbilDataKirim

// Class Untuk selalu memanggil methode ambilJadwal()
 
    class ThreadMenu
      extends Thread {
    public ThreadMenu() {
    } // Akhir Methode ThreadAmbilDataJadwal

    public void run() {
      while (true) {
        pilihMenu();
        try {
          Thread.sleep(3000);
        } // Akhir try
        catch (InterruptedException e) {}
      } // Akhir while
    } //Akhir Methode run
  }
  
  
 

public void prosesPesan(String notlp, String pesan, String metode){
	if(pesan.length()<=160){
		tulisDataTabelKirim(notlp, pesan);
	}
	else if(pesan.length()>160 && pesan.length()<320){

		tulisDataTabelKirim(notlp, pesan.substring(0,159));
		tulisDataTabelKirim(notlp, pesan.substring(160));
	}
	else if(pesan.length()>320 && pesan.length()<480){
		tulisDataTabelKirim(notlp, pesan.substring(0,159));
		tulisDataTabelKirim(notlp, pesan.substring(160,319));
		tulisDataTabelKirim(notlp, pesan.substring(320));
	}
	else if(pesan.length()>480 && pesan.length()<640){
		tulisDataTabelKirim(notlp, pesan.substring(0,159));
		tulisDataTabelKirim(notlp, pesan.substring(160,319));
		tulisDataTabelKirim(notlp, pesan.substring(320,479));
		tulisDataTabelKirim(notlp, pesan.substring(480));
	}
	else{
		tulisDataTabelKirim("6281510093290", "Ada pesan yang panjangnya lebih dari 640, pesan ini berasal dari proses :"+metode);
	}
}


}
 // Akhir Class fixGateway

